﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OPCService.Model;
using NLog;
using JSONItem = JSONDB.Item; //别名

namespace OPCService.Utils
{
    class TagsQueue
    {
        private int size;
        static short interval = short.Parse(ConfigHelper.ReadConfig("interval"));
        static float roc = float.Parse(ConfigHelper.ReadConfig("roc"));
        static Dictionary<string, Queue<Item>> dicQueue = new Dictionary<string, Queue<Item>>();
        public int Size { get; set; }

        public TagsQueue() { }

        public static Queue<Item> InQueue(Item item, Queue<Item> queue)
        {
            Item last;
            int? n = queue?.Count;  //int？表示可空类型，就是一种特殊的值类型，它的值可以为null
            int mid = interval / 2;
            if (n == null || n.Equals(0))
            {
                item.IsInsertDB = true;
                queue = new Queue<Item>();
            }
            else if (n < interval)
            {
                last = queue.Last();
                //item.IsInsertDB =  IsOverAdjoinRateQueue(item, last);
                item.IsInsertDB = true;
            }
            else if (queue.Count.Equals(mid))
            {
                last = queue.Last();
                //item.IsInsertDB = IsOverAdjoinRateQueue(item, last);
                item.IsInsertDB = true;
                if (!item.IsInsertDB)
                {
                    //队列满后第一个与最后个比较变化
                    //item.IsInsertDB = IsOverAdjoinRateQueue(queue.Peek(), last);
                    item.IsInsertDB = true;
                }
                // queue.Clear();

            }
            queue.Enqueue(item);   //将对象添加到 Queue 的结尾处
            return queue;
        }

        public static List<Item> GetQueueFromTagName(Item item, List<JSONItem> jsonItems)
        {
            List<string> tags = new List<string>();
            foreach(JSONItem jsonItem in jsonItems)
            {
                tags.Add(jsonItem.value);
            }
            List<Item> items = new List<Item>();
            Queue<Item> queue;
            try
            {
                if (!tags.Contains(item.tag_name))
                {
                    if (!dicQueue.TryGetValue(item.tag_name, out queue))
                    {
                        dicQueue.Add(item.tag_name, new Queue<Item>());
                        queue = InQueue(item, queue);
                        dicQueue[item.tag_name] = queue;
                    }
                    else
                    {
                        queue = InQueue(item, queue);
                        if (queue.Count.Equals(interval))
                        {
                            items = queue.Where(x => x.IsInsertDB).ToList(); //过滤需要写入数据库的才写入
                            queue.Clear();
                        }
                        dicQueue[item.tag_name] = queue;
                    }
                }
                else
                {
                    //tag为指定的名单，立即存储
                    items.Add(item);
                }
            }
            catch (Exception e)
            {

            }
            return items;
        }

        /// <summary>
        /// 采集的数值是否超出变化范围
        /// </summary>
        /// <param name="currItem"></param>
        /// <param name="lastItem"></param>
        /// <returns></returns>
        public static bool IsOverAdjoinRateQueue(Item currItem, Item lastItem)
        {
            double r = 0.00d;
            if (lastItem.Equals(0) && currItem.value > 0)
            {
                return true;
            }
            double m = Math.Abs(currItem.value - lastItem.value);

            r = m / lastItem.value;
            if (Math.Abs(r) > roc)
            {
                return true;
            }

            return false;
        }

    }
}
